import sys
import cv2
from aip import AipOcr
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QHBoxLayout, QTextEdit, QFileDialog


class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.init_ui()

    # 布局
    def init_ui(self):
        self.setWindowTitle('文字识别系统')
        self.resize(800, 800)
        layout = QHBoxLayout()

        self.btn1 = QPushButton('本地截图识别', self)
        self.btn1.move(150, 50)
        self.btn1.resize(200, 50)
        layout.addWidget(self.btn1)
        self.btn1.clicked.connect(self.local_img)

        self.btn2 = QPushButton('调用摄像头识别', self)
        self.btn2.move(450, 50)
        self.btn2.resize(200, 50)
        layout.addWidget(self.btn2)
        self.btn2.clicked.connect(self.PC_camera)

        self.show_text = QTextEdit(self)
        self.show_text.setReadOnly(True)
        self.show_text.resize(600, 600)
        self.show_text.move(100, 150)
        layout.addWidget(self.show_text)

    # 功能实现区域
    def person_config(self):
        # 配置个人参数（此参数需要个人去创建百度AI开放平台接口）
        # 百度AI开放平台文字识别
        # https://ai.baidu.com/tech/ocr/general
        config = {
            'appId': '***********',
            'apiKey': '************',
            'secretKey': '*************'
        }
        # 构造调用百度aip的请求头
        client = AipOcr(**config)

        return client

    # 读取图像
    def get_img_content(self, file_path):
        with open(file_path, 'rb') as f:
            return f.read()

    # 读取图片中的文字信息并识别文字
    def img_to_string(self, image_path):
        # 传入图片路径
        image_info = self.get_img_content(image_path)

        return_result = self.person_config().handwriting(image_info)

        if return_result['words_result']:
            return '\n'.join([i['words'] for i in return_result['words_result']])

    # 本地截图
    def local_img(self):
        self.show_text.clear()
        # 打开文件管理器
        file_path = QFileDialog.getOpenFileName(self, '打开文件', r'C:\\')
        img_content = self.img_to_string(file_path[0])
        self.show_text.append(img_content)

    # 调用本地摄像头
    def PC_camera(self):
        self.show_text.clear()
        cv2.namedWindow('Camera', 0)
        # 打开电脑自带摄像头
        capture = cv2.VideoCapture(0)

        while True:
            # 获取信息
            success, image = capture.read()
            cv2.imshow('Camera', image)
            # 设置按键动作
            key = cv2.waitKey(10)
            # 根据按键来处理获取的图片以及操控程序
            if key == 32:
                # 空格按键
                # 自动保存此图片
                filename = 'picture.jpg'
                # 将所获取的图像保存至文件中
                cv2.imwrite(filename=filename, img=image)
                # 调用函数实现文字识别的功能
                content = self.img_to_string(filename)
                # 将信息添加进显示框
                self.show_text.append(content)
                break
            elif key == 27:
                # Esc 按键
                break


if __name__ == '__main__':
    app = QApplication(sys.argv)
    page = Main()
    page.show()
    sys.exit(app.exec())
